package app.server.project.main.service.db.dao.user;

import app.server.project.main.service.db.entity.user.UserInviteEntity;
import app.server.project.main.service.db.mapper.user.UserInviteMapper;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * @author Administrator
 * @description 针对表【user_info(用户信息表)】的数据库操作Service实现
 * @createDate 2025-01-16 15:25:22
 */
@Repository
@AllArgsConstructor
public class UserInviteDao extends ServiceImpl<UserInviteMapper, UserInviteEntity> {


    private final static String Cache_Name = "app.server.project.main.service.db.dao.UserInviteDao.getByIds";
    private final static String Cache_FriendLst = "app.server.project.main.service.db.dao.UserInviteDao.getInviteFriend";
    private final static String Cache_InviteUser = "app.server.project.main.service.db.dao.UserInviteDao.getInviteUser";


    /**
     * 检查邀请关系
     *
     * @param inviteUserId
     * @param beInviteUserId
     * @return
     */
    @Cacheable(key = "#inviteUserId+':'+#beInviteUserId", cacheNames = Cache_Name)
    public UserInviteEntity getByIds(long inviteUserId, long beInviteUserId) {
        var data = this.getOne(Wrappers.lambdaQuery(UserInviteEntity.class)
                .eq(UserInviteEntity::getInviteUserId, inviteUserId)
                .eq(UserInviteEntity::getBeInviteUserId, beInviteUserId));
        if (Objects.isNull(data)) {
            //缓存没有,就往库中写入一条数据
            data = UserInviteEntity.of(IdUtil.getSnowflakeNextId());
        }
        data.setSynDb(true);
        return data;
    }

    /**
     * 查询邀请人
     *
     * @return
     */
    @Cacheable(key = "#userId", cacheNames = Cache_InviteUser)
    public UserInviteEntity getInviteUser(long userId) {
        var data = this.getOne(Wrappers.lambdaQuery(UserInviteEntity.class)
                .eq(UserInviteEntity::getBeInviteUserId, userId));
        if (Objects.isNull(data)) {
            //缓存没有,就往库中写入一条数据
            data = UserInviteEntity.ofNull();
        }
        data.setSynDb(true);
        return data;
    }

    @Cacheable(key = "#user.beInviteUserId", cacheNames = Cache_InviteUser)
    public UserInviteEntity flushInviteUserCache(UserInviteEntity user) {
        return user;
    }

    /**
     * 缓存最近3*30数据
     *
     * @param inviteUserId
     * @return
     */
    @Cacheable(key = "#inviteUserId", cacheNames = Cache_FriendLst)
    public List<UserInviteEntity> getInviteFriendCache(long inviteUserId, long cacheSize) {
        Page<UserInviteEntity> page = new Page<>(1, cacheSize);
        var ret = this.page(page, Wrappers.<UserInviteEntity>lambdaQuery()
                .orderByDesc(UserInviteEntity::getId)
                .eq(UserInviteEntity::getInviteUserId, inviteUserId));
        return new ArrayList<>(ret.getRecords());
    }

    /**
     * 从第三页开始，不缓存,直接命中数据库
     *
     * @param inviteUserId
     * @param pageIndex
     * @param pageSize
     * @return
     */
    public List<UserInviteEntity> getInviteFriend(long inviteUserId, int pageIndex, long pageSize) {
        Page<UserInviteEntity> page = Page.of(pageIndex, pageSize);
        return this.page(page, Wrappers.lambdaQuery(UserInviteEntity.class)
                        .eq(UserInviteEntity::getInviteUserId, inviteUserId)
                        .orderByDesc(UserInviteEntity::getId))
                .getRecords();
    }


    public Page<UserInviteEntity> getBeInviteUsers(long inviteUserId, int pageIndex, int pageSize) {
        return this.page(Page.of(pageIndex, pageSize), Wrappers.lambdaQuery(UserInviteEntity.class)
                .eq(UserInviteEntity::getInviteUserId, inviteUserId)
                .orderByDesc(UserInviteEntity::getId));
    }
}




